#include<bits/stdc++.h>
using namespace std;
struct stu{
    int d,v,a;
};
int n,m,l,A,cnt;
stu car[100005];
int sign[100005];
int vis[100005];
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int T;
    cin>>T;
    for(int i=1;i<=T;i++){
        cin>>n>>m>>l>>A;
        for(int j=1;j<=n;j++) cin>>car[j].d>>car[j].v>>car[j].a;
        for(int j=1;j<=m;j++) cin>>sign[j];
        cnt=0;
        for(int i=1;i<=n;i++){
            if(car[i].a>0){
                if(car[i].v>A){
                    cnt++;
                    for(int j=1;j<=m;j++) vis[j]++;
                }else{
                    int flag1=0;
                    for(int j=1;j<=m;j++){
                        if(car[i].d<=sign[j]){
                            double po_w=pow(car[i].v,2);
                            double jv=sqrt(po_w+2.0*car[i].a*(sign[j]-car[i].d));
                            if(jv>A){
                                flag1=1;
                                vis[j]++;
                            }
                        }
                    }
                    cnt+=flag1;
                }
            }
            if(car[i].a<0){
                if(car[i].v>A){
                    int flag2=0;
                    for(int j=1;j<=m;j++){
                        if(car[i].d<=sign[j]){
                            double po_w=pow(car[i].v,2);
                            double jv=sqrt(po_w+2.0*car[i].a*(sign[j]-car[i].d));
                            if(jv>A){
                                flag2=1;
                                vis[j]++;
                            }
                            else{
                                break;
                            }
                        }
                    }
                    cnt+=flag2;
                }
            }
            if(car[i].a==0){
                if(car[i].v>A){
                    cnt++;
                    for(int j=1;j<=m;j++) vis[j]++;
                }
            }
        }
        cout<<cnt<<" ";
        int maxn=INT_MIN,u=1,p=0,la=1;
        while(u<=m+1){
            if(vis[u]==0){
                for(int j=la;j<=u;j++){
                    maxn=max(maxn,vis[j]);
                }
                for(int j=la;j<=u;j++){
                    if(vis[j]==maxn) p++;
                }
                la=u+1;
            }
            u++;
        }
        cout<<p<<endl;
    }
    return 0;
}
